/*
leetcode 剑指offer 12.矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中，返回 true ；否则，返回 false 。

单词必须按照字母顺序，通过相邻的单元格内的字母构成，其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。


示例 1：

输入：board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出：true
示例 2：

输入：board = [["a","b"],["c","d"]], word = "abcd"
输出：false
 

*/

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    int n,m;
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};


    bool dfs(vector<vector<char>>& board,vector<vector<bool>>& visited,string word,int index,int x,int y){
        if(index==word.size()) return true;
        visited[x][y]=true;
        for(int k=0;k<4;k++){
            int nx=x+dx[k];
            int ny=y+dy[k];
            //这里是continue，而不是break
            if(nx<0 || nx>=n || ny<0 || ny>=m || visited[nx][ny]) continue;
            if(board[nx][ny]!=word[index]) continue;
            if(dfs(board,visited,word,index+1,nx,ny)) return true;
        }
        visited[x][y]=false;
        return false;
    }

    bool exist(vector<vector<char>>& board, string word) {
        n=board.size();
        if(n==0) return false;
        m=board[0].size();
            vector< vector<bool> > visited(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(board[i][j]==word[0]){
                    if(dfs(board,visited,word,1,i,j))
                    return true;
                }
            }
        }
        return false;
    }
};
int main() {


    return 0;
}
